#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2021/3/26 23:19
# @Author : cjw
"""
一般的视频网站是怎么做的？
用户上传 -> 转码(把视频做处理，2K, 1080, 标清) ->切片处理(把单个的文件进行拆分)
作用：用户在进行拉动进度条的时候

需要一个文件记录：1、视频播放顺序，2、视频存放的路径
基本上把拆分好的视频片段放到M3U文件中，是一个固定格式的
M3U文件通过utf-8编码后，就会变成M3U8
M3U8文件中：
#开头的具有特殊意思

想要抓取一个视频
1、找到m3u8文件，网站会通过各种手段进行隐藏
2、通过m3u8文件，下载ts文件
3、可以通过各种手段(不仅是编程手段)，把ts文件合并为一个mp4文件
"""

import requests
import re
import os
from lxml import etree

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'
}


def get_m3u8_file(url: str):
    """
    抓取视频步骤：
    1、拿到视频播放页面源代码
    2、从源代码中提取到m3u8的url
    3、下载m3u8
    4、读取m3u8文件，下载视频
    5、合并视频
    :return:
    """
    # 获取视频的m3u8下载地址
    resp = requests.get(url, headers=headers)
    page_text = resp.text
    # 提取电影名称
    html = etree.HTML(page_text)
    title_text = html.xpath('//title/text()')[0]
    # movie_name = title_text.split('《')[1].split('》')[0]
    movie_name = re.search(r'《(?P<name>.*?)》', title_text).group('name')
    # 提取url
    obj = re.compile(r"video: {.*?url: '(?P<url>.*?)',", re.S)
    result = obj.search(page_text)
    m3u8_url = result.group('url')
    resp.close()

    # 请求m3u8下载地址获取内容
    resp_m3u8 = requests.get(m3u8_url, headers=headers)
    content = resp_m3u8.content
    with open(f'./video/{movie_name}.text', 'wb') as f:
        f.write(content)
    resp_m3u8.close()


def get_m3u8_urls(file_path: str):
    """
    解析m3u8文件，获取视频分片下载的url
    :param file_path: m3u8文件路径
    :return:
    """
    url_list = []
    if not os.path.exists(file_path):
        raise FileNotFoundError('文件不存在！')

    # 读取m3u8文件，保存url
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f.readlines():
            line.strip()  # 去掉空格，空白，换行符
            if line.startswith('#'):
                continue
            url_list.append(line)
    return url_list


def download(url: str):
    """
    下载视频url中的视频片段
    :param url:
    :return:
    """
    resp = requests.get(url, headers=headers)
    with open('./video/1.zip', 'wb') as f:
        f.write(resp.content)
    resp.close()


if __name__ == '__main__':
    index_url = 'https://www.91kanju.com/vod-play/25256-1-2.html'
    file_path = './video/怦然心动.text'
    # get_m3u8_file(index_url)
    get_m3u8_urls(file_path)
